package com.hjjt.cameralib.cameraengin

import android.content.Context
import androidx.lifecycle.LifecycleOwner
import com.hjjt.cameralib.opengl.GLFrameSurface
import com.hjjt.cameralib.data.FaceRect
import com.hjjt.cameralib.data.FeatureData
import com.hjjt.cameralib.listener.LiveCheckListener
import com.hjjt.cameraplugin.CameraEngineConfig
import com.hjjt.cameraplugin.ImageData


/**
 *
 * @ProjectName:    PluginDemo
 * @Package:        com.hjjt.cameralib.cameraengin
 * @ClassName:      Camera
 * @Description:
 * @Author:         孙浩
 * @CreateDate:     2022/5/31 15:48
 */
interface CameraEngine {

    /**
     * 初始化，返回 Engine 操作句柄
     *
     * @param context Context
     * @param configPath 算法配置文件路径
     * @param licensePath 授权配置文件路径
     * @return
     */
    fun init( configPath: String,
        licensePath: String
    ): Boolean

    /**
     * 初始化，返回 Engine 操作句柄
     *
     * @param context Context
     * @param configPath 算法配置文件路径
     * @param licensePath 授权配置文件路径
     * @param openMode 相机打开方式
     * @param liveMode 检测方式
     * @return
     */
    fun init( configPath: String,
        licensePath: String,
        openMode: CameraEngineConfig.OpenMode?,
        liveMode: CameraEngineConfig.LiveMode?
    ): Boolean

    fun unInit()

    /**
     * 设置检测回调函数
     */
    fun setEventCallBack(liveCheckListener: LiveCheckListener): Boolean

    fun getCameraParam(): String

    fun setParams(params: String): Long

    /**
     * 执行检测
     *
     * @param decType 检测类型
     * @param timeoutMilliSeconds 超时时间(毫秒) type 为 0 或 1 时有效。 设置为 0 时，立即返回检测结果
     * 是否检测活体
     */
    fun startDetect(decType: CameraEngineConfig.DetectType, timeoutMilliSeconds: Int): Boolean

    /**
     * 终止检测
     */
    fun stopDetect(): Boolean

    /**
     * Open camera.
     *
     * @param cameraType Camera type
     * @return
     */
    fun openCamera(cameraType: CameraEngineConfig.CameraType): Boolean

    /**
     * 关闭相机.
     *
     * @param cameraType 设备类型
     * @return 是否关闭成功
     */
    fun closeCamera(cameraType: CameraEngineConfig.CameraType): Boolean

    /**
     * 设置相机帧数据回调函数，并设置图像数据格式
     *
     * @param cameraType 设备类型  不支持 type 为 CW_CAMERA_OPEN_ALL
     * @param formatType 图像格式
     * @param drawFaceRect 是否附加人脸框
     * @return
     */
    fun setCameraDataListener(
        cameraType: CameraEngineConfig.CameraType,
        formatType: CameraEngineConfig.FormatDataType,
        drawFaceRect: Boolean,
        cameraCallBack: ((data: ImageData) -> Unit)?
    ): Boolean

    /**
     * 设置相机出帧参数
     *
     * @param cameraType 设备类型
     * @param formatType 出流格式
     * @param width 宽
     * @param height 高
     * @param fps 帧率 需在相机支持范围内，超出范围返回相应错误码。默认 30 帧。
     * @return 是否设置成功
     */
    fun setCameraStreamFormat(
        cameraType: CameraEngineConfig.CameraType,
        formatType: CameraEngineConfig.FormatStreamType, width: Int, height: Int, fps: Int
    ): Boolean

    /**
     * 设置相机图像旋转角度和镜像.
     *
     * @param cameraType 设备类型
     * @param angle 旋转角度（顺时针）
     * @param isMirror 镜像模式
     * @return 是否执行成功
     */
    fun setCameraRotateAndMirror(
        cameraType: CameraEngineConfig.CameraType,
        angle: CameraEngineConfig.Angle,
        isMirror: Boolean
    ): Boolean

    /**
     * 设置相机是否开启出流.
     *
     * @param cameraType 设备类型
     * @param streamOn 是否出流
     * @return 错误码
     */
    fun openOrCloseStream(cameraType: CameraEngineConfig.CameraType, streamOn: Boolean): Boolean

    /**
     * 得到当前相机状态
     *
     * @param cameraType 设备类型
     * @return [CameraEngineConfig.CameraStatus] 当前相机状态
     */
    fun getCameraStatus(cameraType: CameraEngineConfig.CameraType): CameraEngineConfig.CameraStatus

    /**
     * 获取相机原始图像帧数据
     *
     * @param cameraType 设备类型
     * @param imageType 图像格式
     * @param isBase64 是否 base64 编码
     * @return [ImageData] 图像结构体
     */
    fun captureImage(
        cameraType: CameraEngineConfig.CameraType,
        imageType: CameraEngineConfig.CaptureImageFormat,
        isBase64: Boolean,
        angle: CameraEngineConfig.Angle
    ): ImageData?

    /**
     * 获取检测结果图像帧数据.
     *
     * @param cameraType 设备类型
     * @param imageType 图像格式 不能为为 RAW
     * @param isBase64 是否 base64 编码
     * @param liveType 图像类型
     * @return [ImageData] 获取检测结果图像帧数据
     */
    fun getDetectedImage(
        cameraType: CameraEngineConfig.CameraType,
        imageType: CameraEngineConfig.CaptureImageFormat,
        isBase64: Boolean,
        liveType: CameraEngineConfig.LiveImageType
    ): ImageData?

    /**
     * 获取特征长度
     */
    fun getFeatureLength(): Int

    /**
     * 获取单个人脸特征信息
     *
     * @param rect 人脸框位置 传 null 时，内部则自动获取人脸框位置。
     * @param imgData 图像数据
     * @param dataLength 图像数据长度
     * @param width 宽
     * @param height 高
     * @param isBase64 是否为 base64 编码
     * @param formatType 图像格式
     * @param onlyKeypt true：只做关键点 false：关键点+提特征
     * @return 特征信息
     */
    fun getFeature(
        rect: FaceRect,
        imgData: ByteArray,
        dataLength: Int,
        width: Int,
        height: Int,
        isBase64: Boolean,
        formatType: CameraEngineConfig.FormatDataType,
        onlyKeypt: Boolean
    ): FeatureData?

    /**
     * 1：N 特征相似度比对
     *
     * @param proboFeature 比对特征
     * @param filedFeature 底库特征集合
     * @param filedNum 底库特征个数
     * @return 成功：CW_LIVENESS_SUCCESS、比对分值数组 失败：对应错误码，详细错误说明请参照通用错误码解释
     */
    fun compareFeature(proboFeature: ByteArray, filedFeature: ByteArray, filedNum: Int): FloatArray?

    /**
     * 设置渲染组件.
     *
     * @param surfaceView Surface view
     */
    fun initSurfaceView(surfaceView: GLFrameSurface?)

    /**
     * 自动绑定生命周期.
     *
     * @param lifecycleOwner Lifecycle owner
     */
    fun bindToLifecycle(lifecycleOwner: LifecycleOwner)

    /**
     * 关闭摄像头组件
     */
    fun close()

    fun setPreviewCallBack(previewCallBack:()->Unit):Boolean

}